﻿using System;
using System.Text;
using System.Data;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient;
using HelpSystem;

namespace DAOLayer
{
    public class CDAOTransportions
    {
        private MySqlConnection m_Connection = null;
        private string m_user = null;

        /// <summary>
        /// Конструктор по умолчанию. Создаёт объект БД без подключения и данных.
        /// </summary>
        public CDAOTransportions()
        {
        }
        /// <summary>
        /// Конструктор, создаёт новый объект доступпа к данным базы данных
        /// </summary>
        /// <param name="ConnectionString">Строка подключения к СУБД.</param>
        public CDAOTransportions(string Server, string Database, string User, string Password)
        {
            ReconnectTo(Server, Database, User, Password);
        }
        /// <summary>
        /// Загружает данные таблицы транспорта
        /// </summary>
        /// <returns>Таблицу содержащую данные о траспорте.</returns>
        public DataTable LoadTableTransport()
        {
            if (Connection != null && Connection.State == ConnectionState.Open)
            {
                //Создаём адаптер данных
                MySqlDataAdapter Adapter = new MySqlDataAdapter("SELECT transport_id, transport.transport_type_id, transport_type, gov_number, vin, date_to FROM transport, s_transport_type WHERE s_transport_type.transport_type_id = transport.transport_type_id;", Connection);
                if (Adapter != null)
                {
                    DataTable Table = new DataTable();
                    Adapter.Fill(Table);
                    return Table;
                }
                else
                    throw new InvalidOperationException("Ошибка создания адаптера данных для таблицы перевозки.");
            }
            else
            {
                throw new InvalidOperationException("Ошибка соединения. Соединение закрыто или отсутсвует.");
            }
        }
        /// <summary>
        /// Возвращает строку таблицы, содержащей 
        /// </summary>
        /// <param name="ID">Идентификатор транспортного средства</param>
        /// <returns>Строку данных с данными транспортного средства</returns>
        public DataRow GetTransportRowByID(int ID)
        {
            if (Connection != null && Connection.State == ConnectionState.Open)
            {
                //Создаём адаптер данных
                MySqlDataAdapter Adapter = new MySqlDataAdapter("SELECT transport_id, transport_type_id, gov_number, vin, date_to FROM transport WHERE transport_id="+ID.ToString(), Connection);
                if (Adapter != null)
                {
                    DataTable Table = new DataTable();
                    Adapter.Fill(Table);
                    if (Table.Rows.Count == 1)
                        return Table.Rows[0];
                    else
                        if (Table.Rows.Count == 0)
                            throw new InvalidOperationException("Идентификатору не соответсвует ниодного транспортного средства.");
                        else
                            throw new InvalidOperationException("Идентификатору соответсвует более одного транспортного средства.");
                }
                else
                    throw new InvalidOperationException("Ошибка создания адаптера данных для таблицы перевозки.");
            }
            else
            {
                throw new InvalidOperationException("Ошибка соединения. Соединение закрыто или отсутсвует.");
            }
        }
        /// <summary>
        /// Метод производящий переподключение к БД.
        /// </summary>
        /// <param name="Server">IP адрес или DNS имя сервера БД</param>
        /// <param name="Database">Имя базы данных</param>
        /// <param name="User">Имя пользователя для подключения</param>
        /// <param name="Password">Пароль пользователя</param>
        public void ReconnectTo(string Server, string Database, string User, string Password)
        {
            Close();
            string ConnectionString = "Database="+Database
                                    +";Data Source="+Server
                                    +";User Id="+User
                                    +";Password="+Password
                                    +";charset=utf8;";
            MySqlConnection NewConnection;
            try
            {
                NewConnection = new MySqlConnection(ConnectionString);
            }
            catch (MySqlException exc)
            {
                MessageBox.Show(exc.Message,
                                "Невозможно создать подключение к БД.",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error);
                return;
            }
            NewConnection.StateChange += new StateChangeEventHandler(OnStateChange);
            m_Connection = NewConnection;
        }
        /// <summary>
        /// Открыть текущее подключение к БД
        /// </summary>
        public bool Open()
        {
            try
            {
                if (Connection != null && Connection.State == ConnectionState.Closed)
                    Connection.Open();
            }
            catch (MySqlException exc)
            {
                switch ((MySqlErrorCode) exc.Number)
                {
                    case MySqlErrorCode.UnknownDatabase:
                    case MySqlErrorCode.UnableToConnectToHost:
                        {
                            Documentation.ShowError(Documentation.ErrorCode.UnableConnectToServer);
                        }
                        break;
                    case MySqlErrorCode.PasswordNoMatch:
                    case MySqlErrorCode.PasswordNotAllowed:
                    case MySqlErrorCode.AccessDenied:
                        {
                            Documentation.ShowError(Documentation.ErrorCode.AccessDenied);
                        }
                        break;
                    default:
                        {
                            Documentation.ShowError("MySQL Error " + exc.Number.ToString() + ":" + exc.InnerException.Message);
                        }
                        break;
                }
                return false;
            }
            return (Connection != null && Connection.State == ConnectionState.Open);
        }
        /// <summary>
        /// Закрыть текущее подключение к БД
        /// </summary>
        public void Close()
        {
            if (m_Connection != null && m_Connection.State == ConnectionState.Open)
                m_Connection.Close();
        }
        /// <summary>
        /// Получить текущие параметры подключения к БД
        /// </summary>
        public MySqlConnection Connection
        {
            get
            {
                return m_Connection;
            }
        }
        /// <summary>
        /// Получить версию сервера БД
        /// </summary>
        public string ServerVersion
        {
            get
            {
                return m_Connection.ServerVersion;
            }
        }
        public string User
        {
            get
            {
                if (m_user == null)
                    return "";
                else
                    return m_user;
            }
        }

        #region Делегаты и события
        private void OnStateChange(Object sender, StateChangeEventArgs e)
        {
            if (StateChanged != null)
                StateChanged(e.CurrentState);
        }
        public delegate void DelegateStateChange(ConnectionState NewState);
        /// <summary>
        /// Событие происходит при изменении состояния текущего подключения.
        /// </summary>
        public event DelegateStateChange StateChanged;
        #endregion
    }
}
